

<!DOCTYPE html>
<html>
<head>
    <title>Pilgrim</title>

    <!-- meta -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- css -->
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="/static/blog/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/blog/css/pace.css">
    <link rel="stylesheet" href="/static/blog/css/custom.css">
    <link rel="stylesheet" href="/static/blog/css/highlights/github.css">

    <style>
        span.highlighted {
            color: yellow;
        }
    </style>

    <!-- js -->
    <script src="/static/blog/js/jquery-2.1.3.min.js"></script>
    <script src="/static/blog/js/bootstrap.min.js"></script>
    <script src="/static/blog/js/pace.min.js"></script>
    <script src="/static/blog/js/modernizr.custom.js"></script>
</head>

<body>
<div class="container">
    <header id="site-header">
        <div class="row">
            <div class="col-md-4 col-sm-5 col-xs-8">
                <div class="logo">
                    <h1><a href="/"><b>Pilgrim</b></a></h1>
                </div>
            </div><!-- col-md-4 -->
            <div class="col-md-8 col-sm-7 col-xs-4">
                <nav class="main-nav" role="navigation">
                    <div class="navbar-header">
                        <button type="button" id="trigger-overlay" class="navbar-toggle">
                            <span class="ion-navicon"></span>
                        </button>
                    </div>

                    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                        <ul class="nav navbar-nav navbar-right">
                            <li class="cl-effect-11"><a href="/" data-hover="首页">首页</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="博客">博客</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="关于">关于</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="联系">联系</a></li>
                        </ul>
                    </div><!-- /.navbar-collapse -->
                </nav>
                <div id="header-search-box">
                    <a id="search-menu" href="#"><span id="search-icon" class="ion-ios-search-strong"></span></a>
                    <div id="search-form" class="search-form">
                        <form role="search" method="get" id="searchform" action="/search/">
                            <input type="search" name="q" placeholder="搜索" required>
                            <button type="submit"><span class="ion-ios-search-strong"></span></button>
                        </form>
                    </div>
                </div>
            </div><!-- col-md-8 -->
        </div>
    </header>
</div>
<div class="copyrights">Collect from <a href="#">blog</a></div>
<div class="copyrights">Modified by <a href="#">博客</a></div>

<div class="content-body">
    <div class="container">
        <div class="row">
            <main class="col-md-8">
                
    <article class="post post-12">
        <header class="entry-header">
            <h1 class="entry-title">http，tcp</h1>
            <div class="entry-meta">
                <span class="post-category">
                    <a href="/category/4/">http、tcp/ip</a></span>
                <span class="post-date"><a href="#"><time class="entry-date"
                                                          datetime="2019年8月26日 17:14">2019年8月26日 17:14</time></a></span>
                <span class="post-author"><a href="#">chenjj</a></span>
                <span class="comments-link">
                    <a href="/post/12/#comment-area">0 评论</a></span>
                <span class="views-count"><a href="#">15 阅读</a></span>
            </div>
        </header>
        <div class="entry-content clearfix">
            <p>1.概念</p>
<div class="codehilite"><pre><span></span>    IP地址：用来定位网络中的一台主机设备位置
    端口：用来定位主机中的某个应用程序，通过该端口进行数据通信
    知名端口：FTP：21   SMTP：25   HTTP：80
    动态端口：共有65536个，一般1024以下端口被系统占用，自定义端口一般选择1024以上，其中 
    MySQL：3306  Redis：6379 无法使用
   TCP协议：是一种面向连接的，可靠的，基于字节流的在传输层上的通信协议
   Socket套接字：一种通信工具，所有需要联网的程序都要使用socket
   UDP协议：用户数据报协议，是一种不可靠的面向无连接的通信协议
   HTTP协议：超文本传输协议，基于TCP传输协议传输数据
   URL：统一资源定位符，也就是网址，通过URL可以查询到网络中对应的网络资源
</pre></div>


<p>2.使用方法：</p>
<div class="codehilite"><pre><span></span>   <span class="n">TCP客户端开发流程</span>
   <span class="err">导入套接字模块：</span><span class="kn">import</span> <span class="nn">socket</span>
   <span class="err">创建</span><span class="n">socket对象</span><span class="err">：</span><span class="n">tcp_client_socket</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span><span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>                
   <span class="err">连接服务器：</span><span class="n">tcp_client_socket</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="err">“</span><span class="n">IP地址</span><span class="err">”</span><span class="p">,</span><span class="err">端口</span><span class="p">))</span>
   <span class="err">发送数据：</span><span class="n">send_data</span> <span class="o">=</span> <span class="err">“你好”</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="err">编码格式</span><span class="p">)</span>
   <span class="err">接收数据：</span><span class="n">recv_data</span> <span class="o">=</span> <span class="n">tcp_client_socket</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
          <span class="n">Print</span><span class="p">(</span><span class="n">recv_data</span><span class="p">)</span>
   <span class="n">Recv_content</span> <span class="o">=</span> <span class="n">recv_data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="err">编码格式</span><span class="p">)</span>
   <span class="err">关闭套接字：</span><span class="n">tcp_client_socket</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</pre></div>


<p>3.出现的问题以及需要注意的点</p>
<div class="codehilite"><pre><span></span>    ①TCP创建客户端时需要注意设置端口复用，绑定端口和设置监听
     建立连接后，当服务端退出后端口号不会立刻释放，需要等待，此时需要设置端口复用来立刻释 放 
     端口
     Tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
     绑定端口，设置监听
     Tcp_server_socket.bind(“”,端口号)   “”是IP地址，不设定为任何IP都能访问
     Tcp_server_socket.listen(128) 设置监听，括号里表示最大连接个数
     ②发送数据时需要把内容编码成二进制格式 encode
     ③接收数据时需要对数据解码 decode
</pre></div>


<p>4.拓展</p>
<div class="codehilite"><pre><span></span>  UDP与TCP的区别
  1.)TCP提供面向连接的传输，传输前需要建立连接，UDP提供无连接传输，通信前不需要建立连接
  2.)TCP提供可靠的传输，UDP提供不可靠传输
  3.)TCP面向字节流传输，因此它能将信息分割成组，并在接收端将其重组，UDP是面向数据报的传 
  输，没有分组开销
  4.)TCP提供拥塞控制和流量控制机制，UDP不提供拥塞控制和流量控制机制
</pre></div>


<p>HTTP的通信过程</p>
<div class="codehilite"><pre><span></span>  1 浏览器通过域名解析服务器（DNS）将域名解析成IP地址
  2 DNS获取到IP地址
  3 浏览器与Web服务器建立连接
  4 浏览器向Web服务器发送HTTP请求
  5 Web服务器根据请求向服务器主机获取资源
  6 服务器主机将资源返回给Web服务器
  7 Web服务器向浏览器返回HTTP响应
</pre></div>


<p>三次握手过程理解</p>
<div class="codehilite"><pre><span></span>   第一次握手：建立连接时，客户端发送syn包（syn=x）到服务器，并进入SYN_SENT状态，等待服 
   务器确认；SYN：同步序列编号（Synchronize Sequence Numbers）。

   第二次握手：服务器收到syn包，必须确认客户的SYN（ack=x+1），同时自己也发送一个SYN包 
（syn=y），即SYN+ACK包，此时服务器进入SYN_RECV状态；

   第三次握手：客户端收到服务器的SYN+ACK包，向服务器发送确认包ACK(ack=y+1），此包发送完 
   毕，客户端和服务器进入ESTABLISHED（TCP连接成功）状态，完成三次握手。
</pre></div>


<p>四次挥手过程理解</p>
<div class="codehilite"><pre><span></span>  1）客户端进程发出连接释放报文，并且停止发送数据。释放数据报文首部，FIN=1，其序列号为 
  seq=u（等于前面已经传送过来的数据的最后一个字节的序号加1），此时，客户端进入FIN-WAIT- 
  1（终止等待1）状态。 TCP规定，FIN报文段即使不携带数据，也要消耗一个序号。
  2）服务器收到连接释放报文，发出确认报文，ACK=1，ack=u+1，并且带上自己的序列号seq=v，此 
  时，服务端就进入了CLOSE-WAIT（关闭等待）状态。TCP服务器通知高层的应用进程，客户端向服 
  务器的方向就释放了，这时候处于半关闭状态，即客户端已经没有数据要发送了，但是服务器若发送 
  数据，客户端依然要接受。这个状态还要持续一段时间，也就是整个CLOSE-WAIT状态持续的时间。
  3）客户端收到服务器的确认请求后，此时，客户端就进入FIN-WAIT-2（终止等待2）状态，等待服 
  务器发送连接释放报文（在这之前还需要接受服务器发送的最后的数据）。
  4）服务器将最后的数据发送完毕后，就向客户端发送连接释放报文，FIN=1，ack=u+1，由于在半关 
  闭状态，服务器很可能又发送了一些数据，假定此时的序列号为seq=w，此时，服务器就进入了 
  LAST-ACK（最后确认）状态，等待客户端的确认。
  5）客户端收到服务器的连接释放报文后，必须发出确认，ACK=1，ack=w+1，而自己的序列号是 
  seq=u+1，此时，客户端就进入了TIME-WAIT（时间等待）状态。注意此时TCP连接还没有释放，必 
  须经过2∗∗MSL（最长报文段寿命）的时间后，当客户端撤销相应的TCB后，才进入CLOSED状态。
  6）服务器只要收到了客户端发出的确认，立即进入CLOSED状态。同样，撤销TCB后，就结束了这次 
  的TCP连接。可以看到，服务器结束TCP连接的时间要比客户端早一些。
</pre></div>


<p>问题1】为什么连接的时候是三次握手，关闭的时候却是四次握手？</p>
<div class="codehilite"><pre><span></span>   答：因为当Server端收到Client端的SYN连接请求报文后，可以直接发送SYN+ACK报文。其中ACK报 
   文是用来应答的，SYN报文是用来同步的。但是关闭连接时，当Server端收到FIN报文时，很可能并 
   不会立即关闭SOCKET，所以只能先回复一个ACK报文，告诉Client端，&quot;你发的FIN报文我收到了&quot;。 
   只有等到我Server端所有的报文都发送完了，我才能发送FIN报文，因此不能一起发送。故需要四步 
   握手。
</pre></div>


<p>【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态？</p>
<div class="codehilite"><pre><span></span>    答：虽然按道理，四个报文都发送完毕，我们可以直接进入CLOSE状态了，但是我们必须假象网络 
    是不可靠的，有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。 
    在Client发送出最后的ACK回复，但该ACK可能丢失。Server如果没有收到ACK，将不断重复发送 
    FIN片段。所以Client不能立即关闭，它必须确认Server接收到了该ACK。Client会在发送出ACK之后 
    进入到TIME_WAIT状态。Client会设置一个计时器，等待2MSL的时间。如果在该时间内再次收到 
    FIN，那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment 
    Lifetime)。MSL指一个片段在网络中最大的存活时间，2MSL就是一个发送和一个回复所需的最大时 
    间。如果直到2MSL，Client都没有再次收到FIN，那么Client推断ACK已经被成功接收，则结束TCP 
    连接。
</pre></div>


<p>【问题3】为什么不能用两次握手进行连接？</p>
<div class="codehilite"><pre><span></span>    答：3次握手完成两个重要的功能，既要双方做好发送数据的准备工作(双方都知道彼此已准备好)， 
    也要允许双方就初始序列号进行协商，这个序列号在握手过程中被发送和确认。
         现在把三次握手改成仅需要两次握手，死锁是可能发生的。作为例子，考虑计算机S和C之间的通 
    信，假定C给S发送一个连接请求分组，S收到了这个分组，并发 送了确认应答分组。按照两次握手 
    的协定，S认为连接已经成功地建立了，可以开始发送数据分组。可是，C在S的应答分组在传输中 
    被丢失的情况下，将不知道S 是否已准备好，不知道S建立什么样的序列号，C甚至怀疑S是否收到 
    自己的连接请求分组。在这种情况下，C认为连接还未建立成功，将忽略S发来的任何数据分 组，只 
    等待连接确认应答分组。而S在发出的分组超时后，重复发送同样的分组。这样就形成了死锁。
</pre></div>


<p>【问题4】如果已经建立了连接，但是客户端突然出现故障了怎么办？</p>
<div class="codehilite"><pre><span></span>    TCP还设有一个保活计时器，显然，客户端如果出现故障，服务器不能一直等下去，白白浪费资 
    源。服务器每收到一次客户端的请求后都会重新复位这个计时器，时间通常是设置为2小时，若两小 
    时还没有收到客户端的任何数据，服务器就会发送一个探测报文段，以后每隔75秒钟发送一次。若 
   一连发送10个探测报文仍然没反应，服务器就认为客户端出了故障，接着就关闭连接。
</pre></div>
            <div class="widget-tag-cloud">
                <ul>
                    标签：
                    
                </ul>
            </div>
        </div>
    </article>
    <section class="comment-area" id="comment-area">
        <hr>
        <h3>发表评论</h3>
        <form action="/comment/post/12/" method="post" class="comment-form">
            
            <div class="row">
                <div class="col-md-4">
                    <label for="id_name">名字：</label>
                    <input id="id_name" maxlength="100" name="name" type="text" required />
                    
                </div>
                <div class="col-md-4">
                    <label for="id_email">邮箱：</label>
                    <input id="id_email" maxlength="255" name="email" type="email" required />
                    
                </div>
                <div class="col-md-4">
                    <label for="id_url">URL：</label>
                    <input id="id_url" maxlength="200" name="url" type="url" />
                    
                </div>
                <div class="col-md-12">
                    <label for="id_text">评论：</label>
                    <textarea cols="40" id="id_text" name="text" rows="10" required>
</textarea>
                    
                    <button type="submit" class="comment-btn">发表</button>
                </div>
            </div>    <!-- row -->
        </form>
        <div class="comment-list-panel">
            <h3>评论列表，共 <span>0</span> 条评论</h3>
            <ul class="comment-list list-unstyled">
                
                    暂无评论
                
            </ul>
        </div>
    </section>

            </main>
            <aside class="col-md-4">
                
    <div class="widget widget-content">
        <h3 class="widget-title">文章目录</h3>
        <div class="toc">
<ul></ul>
</div>

    </div>

                <div class="widget widget-recent-posts">
                    <h3 class="widget-title">最新文章</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/post/23/">数据分析推荐书籍</a>
                            </li>
                        
                            <li>
                                <a href="/post/32/">提高并发的方法</a>
                            </li>
                        
                            <li>
                                <a href="/post/25/">Python数据结构与算法（几种排序）</a>
                            </li>
                        
                            <li>
                                <a href="/post/21/">下山</a>
                            </li>
                        
                            <li>
                                <a href="/post/19/">cjj</a>
                            </li>
                        
                    </ul>
                </div>
                <div class="widget widget-archives">
                    <h3 class="widget-title">归档</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/archives/2019/12/">2019
                                    年 12 月</a>
                            </li>
                        
                            <li>
                                <a href="/archives/2019/10/">2019
                                    年 10 月</a>
                            </li>
                        
                            <li>
                                <a href="/archives/2019/8/">2019
                                    年 8 月</a>
                            </li>
                        
                    </ul>
                </div>

                <div class="widget widget-category">
                    <h3 class="widget-title">分类</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/category/1/">陈俊杰 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/2/">数据库 <span
                                        class="post-count">(5)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/3/">消息队列 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/4/">http、tcp/ip <span
                                        class="post-count">(6)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/5/">多任务 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/6/">redis <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/7/">git <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/8/">状态保持 <span
                                        class="post-count">(2)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/10/">Docker <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/11/">搜索引擎 <span
                                        class="post-count">(2)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/12/">数据分析 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/13/">数据结构与算法 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/14/">markdown语法 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/15/">非阻塞式IO <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                    </ul>
                </div>

                <div class="widget widget-tag-cloud">
                    <h3 class="widget-title">标签</h3>
                    
                    <ul>
                        
                            暂无标签！
                        
                    </ul>
                </div>

                <div class="rss">
                    <a href="#">才华撑不起野心，经济撑不起梦想</a>
                </div>
            </aside>
        </div>
    </div>
</div>
<footer id="site-footer">
    <div class="container">
        <div class="row">
            <div class="col-md-12">

                </p>
            </div>
        </div>
    </div>
</footer>

<!-- Mobile Menu -->
<div class="overlay overlay-hugeinc">
    <button type="button" class="overlay-close"><span class="ion-ios-close-empty"></span></button>
    <nav>
        <ul>
            <li><a href="/">首页</a></li>
            <li><a href="#">博客</a></li>
            <li><a href="#">关于</a></li>
            <li><a href="#">联系</a></li>
        </ul>
    </nav>
</div>

<script src="/static/blog/js/script.js"></script>

</body>
</html>
